package com.navinfo.tripanalysis.common.arithmetic.common;

import com.navinfo.tripanalysis.common.arithmetic.DrivingEco;
import com.navinfo.tripanalysis.common.arithmetic.IdleParking;
import lombok.Data;

import java.math.BigDecimal;

/**
 * 各个算法依赖的公共数据
 * Created by shen on 2018/3/28.
 */
@Data
public class CommonData {
    /**
     * 车辆id(公共)
     */
    private String terminalId;
    /**
     * gps时间，单位毫秒 （公共）
     */
    private long gpsTime;
    /**
     * 上个点的gps时间，单位毫秒 （公共）
     **/
    private long lastGpsTime;
    /**
     * 速度,单位m/s (公共)
     */
    private BigDecimal speedMs;
    /**
     * 上个点的速度,单位m/s (公共)
     */
    private BigDecimal lastSpeedMs;
    /**
     * 速度,单位km/h (公共)
     */
    private int speedKmh;
    /**
     * 纬度 ，单位：以度为单位乘以10的6次方(公共)
     */
    private int latitude;
    /**
     * 经度 ，单位：以度为单位乘以10的6次方(公共)
     */
    private int longitude;
    /**
     * 高程，海拔高度，单位米 (公共)
     */
    private int height;
    /**
     * 方向0-359正北为0顺时针(公共)
     */
    private int gpsDirection;
    /**
     * 发动机输出扭矩，单位：%(公共)
     */
    private int engineOutputTorque;
    /**
     * 转速，单位：rpm（转每分钟）(公共)
     */
    private int rotation;
    /**
     * 上个点的发动机转速，单位：rpm （公共）
     */
    private int lastRotation;
    /**
     * 油门开度，单位：%(公共)
     */
    private double accelerator;
    /**
     * 离合器开关(公共)
     */
    private int clutchSwitch;
    /**
     * 发动机瞬时油耗，单位：km/L(公共)
     */
    private BigDecimal realTimeOilConsumption;
    /**
     * 发动机燃油消耗率,单位：L/h(公共)
     */
    private BigDecimal fuelConsumptionRate;


    /*
     * 0f37特有的指标
     */
    /**
     * 制动信号(来自0F37，0200为0)
     */
    private int brake;
    /**
     * 大气温度(来自0F37，0200为0)
     */
    private int atmosphericTem;
     /**
      * 尿素喷射量(来自0F37，0200为0)
     */
    private double ureaInjection ;
    /**
     * 尿素液位(来自0F37，0200为0)
     */
    private double ureaLevel ;
    /**
     * 上一点尿素液位(来自0F37，0200为0)
     */
    private double lastUreaLevel ;
    /**
     * 仪表车速(来自0F37，0200为0)
     */
    private int instrumentSpeed ;



    /*
    * 0200特有的指标
    */
    /**
     * 当前点的序号（来自0200，0F37为0）
     */
    private int serialNumber;
    /**
     * 上个点的serialnumber（来自0200，0F37为0）
     **/
    private int lastSerialNumber;
    /**
     * 当前点ACC状态(0200特有)
     */
    private Boolean accStatus;
    /**
     * 当前点是否为定速巡航状态(0200特有)
     */
    private Boolean cruiseControl;
    /**
     * 油液百分比(0200特有)
     */
    private Double oilPercentage;
    /**
     * 燃油消耗总量，单位升(0200特有)
     */
    private Double totalOil;
    /**
     * 上一点燃油消耗总量，单位升(0200特有)
     */
    private Double lastTotalOil;
    /**
     * 水温(0200特有).
     */
    private Double waterTemp;
    /**
     * 进气温度(0200特有)
     */
    private Integer intakeAirTem;
    /**
     * 进气压力(0200特有)
     */
    private Integer dpfPressure;
    /**
     * 0：手刹关；1：手刹开(0200特有)
     */
    private Integer handBrakeStatus;
    /**
     * 空挡滑行，1:空挡滑行 0:正常(0200特有)
     */
    private Integer slideNeutralStatus;
    /**
     * 急加速，1:急加速 0:正常(0200特有)
     */
    private Integer rapidAccelerationStatus;
    /**
     * 急减速，1:急减速 0:正常(0200特有)
     */
    private Integer rapidDecelerationStatus;
    /**
     * 急转弯状态,1:急转弯 0:正常(0200特有)
     */
    private Integer sharpTurningStatus;
    /**
     * 猛踩油门报警状态，1:猛踩油门 0:正常(0200特有)
     */
    private Integer slamTheAcceleratorStatus;
    /**
     * AMT载重，单位kg(0200特有)
     */
    private Integer amtLoad;
    /**
     * VECU载重，单位kg(0200特有)
     */
    private Integer vecuLoad;


    /*
     * IntegrateSupportUtil.assign设置的指标
     */
    /**
     * 与上一个报文时间差，单位毫秒 (IntegrateSupportUtil.assign设置，公共)
     */
    private int dffTime;
    /**
     * 加速度,单位：米/平方秒 (IntegrateSupportUtil.assign设置，公共)
     */
    private double acceleratedSpeed;

    /*
    * AbstractAlgorithmChainService设置的指标
    */
    /**
     * 是否是行程第一个点，AbstractAlgorithmChainService设置
     */
    private boolean tripFirstNode;
    /**
     * 是否是行程最后一个点，AbstractAlgorithmChainService设置
     */
    private boolean tripLastNode;


    /*
     *  算法设置的指标
     */
    /**
     * 与上一个报文之间油耗，单位毫升（Mileage计算而来）
     */
    private double dffOil;
    /**
     * 与上一个报文距离差,单位米（Mileage计算而来）
     */
    private double dffDistance;
    /**
     * 行程的积分里程 单位:M（Mileage计算而来）
     **/
    private double integralMileage;
    /**
     * 行程的积分油耗 单位:ML，（Mileage计算而来）
     **/
    private double integralFuel;
    /**
     * 行程的累加工作时长，单位:秒（Mileage计算而来）
     */
    private double engineWorkTime;
    /**
     * 行程的累加刹车次数（Brake计算而来）
     */
    private int brakeNumber;
    /**
     * 档位，单位：无(Gear算法计算而来)
     */
    private int gear;
    /**
     * 坡度（SlopeDriving计算而来）
     */
    private double slope;
    /**
     * 当前点是否为ECO经济驾驶状态（{@link DrivingEco}ECO经济驾驶算法设置此值）
     */
    private boolean ecoDriving;
    /**
     * 当前点是否为停车怠速状态（{@link IdleParking}怠速算法设置此值）
     */
    private boolean parkingIdle;
    /**
     * 尿素液位异常阈值
     */
    private Long ureaAbnormalLevel;
    /**
     * 当前点是否为工作状态（非怠速）
     */
    public boolean isWork() {
        return !parkingIdle;
    }


    public void clearData() {
        this.terminalId=null;
        this.speedKmh=0;
        this.speedMs=null;
        this.lastSpeedMs=null;
        this.gpsTime=0;
        this.lastGpsTime=0;
        this.latitude=0;
        this.longitude=0;
        this.height=0;
        this.engineOutputTorque=0;
        this.rotation=0;
        this.lastRotation=0;
        this.accelerator=0;
        this.clutchSwitch=0;
        this.realTimeOilConsumption=null;
        this.fuelConsumptionRate=null;
        this.brake=0;
        this.atmosphericTem =0;

        this.ureaInjection=0;
        this.ureaLevel=0;
        this.lastUreaLevel=0;
        //IntegrateSupportUtil.assign设置的指标
        this.dffTime=0;
        this.acceleratedSpeed=0.0;

        //AbstractAlgorithmChainService设置的指标
        this.tripLastNode=false;
        this.tripFirstNode=false;

        //算法设置的指标
        this.gear=0;
        this.slope=0;
        this.brakeNumber=0;
        this.engineWorkTime=0;
        this.integralMileage=0;
        this.integralFuel=0;
        this.dffOil=0;
        this.dffDistance=0;
        this.ecoDriving=false;
        this.parkingIdle=false;

        //0200的指标不用清理
    }

    public static Boolean isStatusOpen(Integer status){
        if(status==null){
            return null;
        }
        return status.intValue()==1;
    }
}
